<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns="http://kadm.com.ua/XMLSchema/Grammar" xmlns:parser="http://kadm.com.ua/XMLSchema/Parser"
  xmlns:set="http://kadm.com.ua/XMLSchema/Set" xmlns:lax="http://kadm.com.ua/XMLSchema/Lax">
  <xsl:output method="xml" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="text()"/>

  <xsl:template match="@*"/>

  <xsl:template match="/">
    <parser:table>
      <xsl:apply-templates select="//*[@parser:state]" mode="state"/>
    </parser:table>
  </xsl:template>

  <xsl:template match="*[@parser:state]" mode="state">
    <parser:row parser:state="{@parser:state}">
      <xsl:if test="name() = 'rule'">
        <xsl:attribute name="parser:node">
          <xsl:value-of select="@name"/>
        </xsl:attribute>
      </xsl:if>
      <xsl:apply-templates/>
    </parser:row>
  </xsl:template>

  <xsl:template match="expr">
    <parser:transition>
      <xsl:copy-of select="@optional | @repeat"/>
      <xsl:apply-templates select="*"/>
    </parser:transition>
  </xsl:template>

  <xsl:template match="terminal">
    <xsl:attribute name="parser:set">
      <xsl:value-of select="@parser:number"/>
    </xsl:attribute>
    <xsl:if test="lax:literal">
      <xsl:attribute name="parser:literal">
        <xsl:value-of select="lax:literal"/>
      </xsl:attribute>
    </xsl:if>
  </xsl:template>

  <xsl:template match="group">
    <xsl:attribute name="parser:ref">
      <xsl:value-of select="@parser:state"/>
    </xsl:attribute>
  </xsl:template>

  <xsl:template match="ref">
    <xsl:variable name="rule-name" select="text()"/>
    <xsl:attribute name="parser:ref">
      <xsl:value-of select="//rule[@name = $rule-name]/@parser:state"/>
    </xsl:attribute>
  </xsl:template>
</xsl:stylesheet>
